


# ---------------短信验证码的后端实现逻辑 -----------------
from django_redis import get_redis_connection
from rest_framework.response import Response
from rest_framework.views import APIView

from celery_tasks.sms.tasks import send_sms_code
from meiduo_mall.utils.exceptions import logger

'''
思路

1. 生成短信验证码
2.将生成的短信验证码发送给云通讯
3.保存短信验证码 redis
4. 60秒内禁止再次发送验证码的实现
5， 发送成功后的响应数据

'''


# 定义了一个序列化器继承与基类
class SMSCodeView(APIView):

    def get(self, request, mobile):

        # 获取strictredis保存数据
        strict_redis = get_redis_connection('sms_codes')

        # 4. 60秒内禁止再次发送验证码的实现
        send_flag = strict_redis.get('send_flag_%s' % mobile)
        if send_flag:
            return Response({'message':'发送过于频繁'})
            # raise ValidationError({'message':'发送过于频繁'})

        # 1.生成短信验证码
        import random
        sms_code= '%06d'%random.randint(0, 999999)
        logger.info('sms_code%s'%sms_code)
        print('短信验证码为：%s'%sms_code)

        # 2.使用云通讯发送短信验证码
        # CCP().send_template_sms(mobile, [sms_code, 5], 1)

        # 3. 通过redis 保存生成的短信的验证码  setex 为验证码的有效时长
        # strict_redis.setex('sms_%s'%mobile, 60*5, sms_codes)  # 设置验证码在redis 在redis中有效时长为5分钟

        # strict_redis.setex('send_flag_%s'%mobile, 60, 1)  # 验证码倒计时1分钟

        # 使用delay方法发送短信 保存函数名 函数参数 任务标识等到redis中
        send_sms_code.delay(mobile, sms_code)

        # 使用pipeline管道执行redis命令(优化)
        pipeline = strict_redis.pipeline()
        pipeline.setex('sms_%s'%mobile, 60*5, sms_code)
        pipeline.setex('send_flag_%s'%mobile, 60, 1)
        result = pipeline.execute()
        print(result)  # 结果为一个列表

        # 5.发送成功后的响应数据
        return Response({'message':'ok'})












